home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / misc / nledit / nledit.c < prev   
Encoding:
C/C++ Source or Header  |  1994-02-20  |  8.7 KB  |  318 lines

  1. /*
  2.    nledit.c    Simple Nodelist editor
  3.  
  4.    $Header$
  5.  
  6.    Most code shamelessly stolen from ParseLst. See original ParseLst
  7.    header at the tail of the file for more info.
  8.  
  9.    Usage:
  10.        nledit    nodelist diff newlist
  11.  
  12.    The hard work should be done by a shell/Perl script ;-)
  13. */
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. /*
  18.  *
  19.  * -rev 04-16-87  (abbreviated)
  20.  *  The CRC-16 routines used by XMODEM, YMODEM, and ZMODEM
  21.  *  are also in this file, a fast table driven macro version
  22.  */
  23.  
  24. /* crctab calculated by Mark G. Mendel, Network Systems Corporation */
  25. static unsigned short crctab[256] =
  26. {
  27.   0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
  28.   0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
  29.   0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
  30.   0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
  31.   0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
  32.   0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
  33.   0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
  34.   0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
  35.   0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
  36.   0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
  37.   0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
  38.   0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
  39.   0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
  40.   0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
  41.   0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
  42.   0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
  43.   0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
  44.   0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
  45.   0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
  46.   0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
  47.   0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
  48.   0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
  49.   0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
  50.   0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
  51.   0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
  52.   0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
  53.   0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
  54.   0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
  55.   0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
  56.   0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
  57.   0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
  58.   0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
  59. };
  60.  
  61. /*
  62.  * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell.
  63.  *  NOTE: First srgument must be in range 0 to 255.
  64.  *        Second argument is referenced twice.
  65.  *
  66.  * Programmers may incorporate any or all code into their programs,
  67.  * giving proper credit within the source. Publication of the
  68.  * source routines is permitted so long as proper credit is given
  69.  * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
  70.  * Omen Technology.
  71.  */
  72.  
  73. #define updcrc(cp, crc) ( crctab[((crc >> 8) & 255) ^ cp] ^ (crc << 8))
  74.  
  75. FILE *old_file, *diff_file, *new_file;
  76. char *nodelist, *difflist, *new_name;
  77. unsigned short official_crc = 0;
  78. unsigned short calc_crc = 0;    /* Until I find out how to do the CRC */
  79.  
  80. unsigned short
  81. crcstr (char *buf, unsigned short crc)
  82. {
  83.   unsigned char *p;
  84.   void fix_up (char *p);
  85.  
  86.   p = buf;
  87.   fix_up (p);
  88.  
  89.   while (*p)
  90.     {
  91.       crc = updcrc (*p++, crc);
  92.     }
  93.  
  94.   /*
  95.      Like it or not, somebody decided that Nodelists have their CRC
  96.      also on the End-Of-Line markers. If you know him, flame him.
  97.    */
  98.   crc = updcrc ('\r', crc);
  99.   crc = updcrc ('\n', crc);
  100.   *p = '\n';
  101.  
  102.   return (crc);
  103. }
  104.  
  105. void
  106. fix_up (char *buf)
  107. {
  108.   char *p;
  109. #if 0
  110.   int stripped = 0;
  111. #endif
  112.  
  113.   p = buf + strlen (buf) - 1;
  114.   if (*p == '\n')
  115.     --p;
  116.   while (*p == ' ')
  117.     --p;
  118.   *(p + 1) = '\0';
  119.  
  120.   /* Now get rid of rotten chars */
  121. #if 0
  122.   /*
  123.      Some lists have 8bit in them, and of course they are used for
  124.      calculations. Shit. 
  125.    */
  126.   p = buf;
  127.   while (*p)
  128.     {
  129.       if ((unsigned char) *p >= 128)
  130.     *p = '?', stripped++;
  131.       
  132.       ++p;
  133.     }
  134.   if (stripped)
  135.     printf("Warning: stripped (%s)\n", buf);
  136. #endif
  137. }
  138.  
  139. void
  140. add_files ()            /* Actually put the new lines in here */
  141. {
  142.   char old_line[256];
  143.   char diff_line[256];
  144.   char *pnt_line;
  145.   char first_char;
  146.   char *diff_result;
  147.   char *old_result;
  148.   char *ptr;
  149.   int i, j, k;
  150.   int first_diff;
  151.  
  152.   first_diff = 1;
  153.  
  154.   pnt_line = (char *) malloc (256);
  155.  
  156.   while ((diff_result = fgets (diff_line, 256, diff_file)) != NULL)
  157.     {
  158.       strcpy (pnt_line, diff_line);
  159.       first_char = diff_line[0];
  160.  
  161.       switch (first_char)
  162.     {
  163.     case ';':
  164.       continue;
  165.  
  166.     case 'D':
  167.       j = atoi (pnt_line + 1);
  168.       for (i = 0; i < j; i++)
  169.         {
  170.           old_result = fgets (old_line, 256, old_file);
  171.         }
  172.       break;
  173.  
  174.     case 'A':
  175.       j = atoi (pnt_line + 1);
  176.       for (i = 0; i < j; i++)
  177.         {
  178.           diff_result = fgets (diff_line, 256, diff_file);
  179.           if (!first_diff)
  180.         calc_crc = crcstr (diff_line, calc_crc);
  181.           else
  182.         {
  183.           first_diff = 0;
  184.           ptr = strrchr (diff_line, ':');
  185.           if (ptr != NULL)
  186.             {
  187.               ++ptr;
  188.               official_crc = atoi (ptr);
  189.             }
  190.         }
  191.           k = fputs (diff_line, new_file);
  192.         }
  193.       break;
  194.  
  195.     case 'C':
  196.       j = atoi (pnt_line + 1);
  197.       for (i = 0; i < j; i++)
  198.         {
  199.           diff_result = fgets (old_line, 256, old_file);
  200.           calc_crc = crcstr (old_line, calc_crc);
  201.           k = fputs (old_line, new_file);
  202.         }
  203.       break;
  204.  
  205.     default:
  206.       printf ("\n\tI don't understand this line.\n");
  207.       break;
  208.     }
  209.     }
  210.  
  211.   if (calc_crc != official_crc)
  212.     {
  213.       fputs (";A This nodelist does not have the proper CRC!\n", new_file);
  214.       printf ("This nodelist does not have the proper CRC %u/%u!\n",
  215.           calc_crc, official_crc);
  216.       printf ("Please check out the problem and correct it.\n\n");
  217.     }
  218.  
  219.   fprintf (new_file, "%c", '\032');
  220.  
  221.   return;
  222. }
  223.  
  224. int
  225. open_infiles (char *nodelist, char *difflist, char *new_name)
  226. {
  227.   char first_line[256], *result;
  228.   char temp[11];
  229.   int i, j = 0;
  230.  
  231.   result = fgets (first_line, 256, diff_file);
  232.  
  233.   for (i = 0; i < 80; i++)
  234.     if (first_line[i] == ':')
  235.       j = i;
  236.  
  237.   for (i = 0; i < 10; i++)
  238.     temp[i] = first_line[i + j + 1];
  239.  
  240.   official_crc = atoi (temp);
  241.   j -= 5;
  242.  
  243.   for (i = 0; i < 5; i++)
  244.     temp[i] = first_line[i + j];
  245.  
  246.   temp[5] = '\0';
  247.   j = atoi (temp);
  248.   result = strrchr (nodelist, '.');
  249.   result++;
  250.   i = atoi (result);
  251.   if (i != j)
  252.     {
  253.       printf ("NodeDiff doesn't match to existing Nodelist file! Skipping...\n");
  254.       return (1);
  255.     }
  256.   new_file = fopen (new_name, "w");
  257.   if (new_file == NULL)
  258.     {
  259.       printf ("Can't open new nodelist file %s!\n", new_name);
  260.       return (1);
  261.     }
  262.   printf ("Applying '%s' to '%s' into '%s'\n", difflist, nodelist, new_name);
  263.   return (0);
  264. }
  265.  
  266. /*
  267.     Here's my two cents to the original version (parselst/edit.c)
  268.  */
  269. int
  270. main (int argc, char **argv)
  271. {
  272.   /*
  273.       No Checking, No Time. Shellscript should do it.
  274.     */
  275.   nodelist = argv[1];
  276.   difflist = argv[2];
  277.   new_name = argv[3];
  278.   old_file = fopen (argv[1], "r");
  279.   diff_file = fopen (argv[2], "r");
  280.   if (!open_infiles (nodelist, difflist, new_name))
  281.     add_files ();
  282.  
  283.   return 0;
  284. }
  285.  
  286. /*
  287.                               Nodelist Parser
  288.  
  289.               This module was originally written by Bob Hartman
  290.                        Sysop of FidoNet node 1:104/501
  291.  
  292.  This program source code is being released with the following provisions:
  293.  
  294.  1.  You are  free to make  changes to this source  code for use on your own
  295.  machine,  however,  altered source files may not be distributed without the
  296.  consent of Spark Software.
  297.  
  298.  2.  You may distribute "patches"  or  "diff" files for any changes that you
  299.  have made, provided that the "patch" or "diff" files are also sent to Spark
  300.  Software for inclusion in future releases of the entire package.   A "diff"
  301.  file for the source archives may also contain a compiled version,  provided
  302.  it is  clearly marked as not  being created  from the original source code.
  303.  No other  executable  versions may be  distributed without  the  consent of
  304.  Spark Software.
  305.  
  306.  3.  You are free to include portions of this source code in any program you
  307.  develop, providing:  a) Credit is given to Spark Software for any code that
  308.  may is used, and  b) The resulting program is free to anyone wanting to use
  309.  it, including commercial and government users.
  310.  
  311.  4.  There is  NO  technical support  available for dealing with this source
  312.  code, or the accompanying executable files.  This source  code  is provided
  313.  as is, with no warranty expressed or implied (I hate legalease).   In other
  314.  words, if you don't know what to do with it,  don't use it,  and if you are
  315.  brave enough to use it, you're on your own.
  316.  
  317. */
  318.